/*实用工具类， 在日志项目中可能会频繁使用
    1.获取当前事件
    2.判断指定文件是否存在
    3.获取文件路径
    4.创建目录
*/

#pragma once
#include <iostream>
#include <string>
#include <ctime>
#include <sys/stat.h>
#include <sys/types.h>

namespace logging
{
    namespace util
    {
        class Date
        {
        public:
            static time_t getTime() { return static_cast<time_t>(time(nullptr)); }
        };

        class File
        {
        public:
            static bool exists(const std::string &pathname)
            {
                struct stat statbuf;
                if(stat(pathname.c_str(), &statbuf) == 0) return true;
                return false;
            }

            static std::string getFilePath(const std::string &pathname)
            {
                // ./abc/def/g.txt
                size_t pos = pathname.find_last_of("/\\");
                if(pos == std::string::npos) return "."; // 如果没找到分隔符，则说明该文件就在当前目录下
                return pathname.substr(0, pos + 1);
            }

            static void createDirectory(const std::string &directory)
            {
                // ./abc/def/g.txt
                // 判断是纯路径，还是带了文件名，如果带了文件名，需要将文件名去掉 TODO
                //if(directory.rfind(".") == std::string::npos) {
                //    return;
                //}

                size_t pos = 0, cur = 0;
                while(cur < directory.size())
                {
                    pos = directory.find_first_of("/\\", cur);
                    if(pos == std::string::npos) {
                        // ./abc/def/g.txt
                        // 最后一次进入这里，有可能会包含文件名，导致创建失败
                        // 但我们的目的只有创建目录，目录在下面的过程中已经创建好了，这里失败了也没有关系
                        int n = mkdir(directory.c_str(), 0777);
                        break;
                    }
                    std::string parent_dir = directory.substr(0, pos + 1);
                    if(exists(parent_dir)) {
                        cur = pos + 1;
                        continue;
                    }
                    mkdir(parent_dir.c_str(), 0777);
                    cur = pos + 1;
                }
            }
        };
    }
}